//
//  HMStatus.swift
//  大深圳微博01
//
//  Created by shenzhenIOS on 16/4/12.
//  Copyright © 2016年 shenzhenIOS. All rights reserved.
//

import UIKit

/// 微博模型
class HMStatus: NSObject {

    /// 微博创建时间
    var created_at: String?
    
    /// 微博ID
    var id:	Int64 = 0
    
    /// 微博信息内容
    var text: String?
    
    /// 微博来源
    var source: String? {
        didSet {
            // 当KVC给来源赋值,我们重新处理来源
            if let newSource = source {
                // 截取字符串 String
                guard let firstRange = newSource.rangeOfString("\">") else {    // 58..<60   58 59
                    print("没有匹配\">")
                    return
                }
                
                guard let secondRange = newSource.rangeOfString("</a>") else {  // 68..<72 68 69 70 71
                    print("没有匹配</a>")
                    return
                }
                
//                print("firstRange: \(firstRange)")
//                print("secondRange: \(secondRange)")
                
                // 拼接来源的范围 360安全浏览器 (60 67) 60..<68  60 是firstRange的结尾(endIndex)  68: secondRange的开始 startIndex
                let range = firstRange.endIndex..<secondRange.startIndex
                
                // 将截取的字符串重新给source赋值, 在didSet重新给自己赋值,不会触发didSet.
                source = "来自 " + newSource.substringWithRange(range)
            }
        }
    }
    
    /// 微博的配图 [Int], [String: AnyObject], [[String: AnyObject]]
    /// 数组,里面保存的是字典
    var pic_urls:[[String: AnyObject]]? {
        didSet {
            // 当KVC给pic_urls赋值时,将pic_urls转成NSURL数组方便外面的人来使用
            let count = pic_urls?.count ?? 0
            
            // 没有图片要显示
            if count == 0 {
                return
            }
            
            // 创建storePicutreURLs数组保存NSURL
            storePicutreURLs = [NSURL]()
            
            // 有图片要显示
            for dict in pic_urls! {
                // 获取到每个字典,解析thumbnail_pic所对应的value,value是一个图片的地址(String)
                let urlString = dict["thumbnail_pic"] as! String
                
                let url = NSURL(string: urlString)!
                
                storePicutreURLs?.append(url)
            }
        }
    }
    
    /// 模型提供好用一点的图片NSURL数组
    var storePicutreURLs: [NSURL]?
    
    /// 用户模型, 服务器返回的用户数据是字典,需要我们自己来转模型
    var user: HMUser?
    
    /// 被转发的原微博信息字段，当该微博为转发微博时返回
    var retweeted_status: HMStatus?
    
    /// 缓存cell的行高
    var rowHeight: CGFloat?
    
    /// 字典转模型
    init(dict: [String: AnyObject]) {
        super.init()
        
        // 获取字典中的所有key,来模型中找属性,找到属性后,将字典中的value赋值给模型中的对应的属性
        //["id": 10, "text": "哈哈", "source": "来源", "aa": "不知道"]
//        HMPrint("开始KVC赋值")
        setValuesForKeysWithDictionary(dict)
    }
    
    // setValuesForKeysWithDictionary最终会调用这个方法,字典中有多少个key,就会调用多少次setValue:forKey:
    // value: 字典中的value, key: 字典中的key
    override func setValue(value: AnyObject?, forKey key: String) {
//        HMPrint("forKey: \(key), value: \(value)")
        // 拦截user这个key，不要系统来KVC,我们自己来赋值
        if key == "user" {
            // 在判断value是不是字典
            if let dict = value as? [String: AnyObject] {
                // 字典转模型,并且赋值给user属性
                user = HMUser(dict: dict)
            }
            
            // 一定要返回,如果不返回,又会调用 super.setValue(value, forKey: key),又会将value（字典）赋值给user
            return
        }
        
        // 拦截retweeted_status这个key，不要系统来KVC,我们自己来赋值
        // 1.key == retweeted_status, 2. value可以转成字典
        if key == "retweeted_status", let dict = value as? [String: AnyObject] {
            // 字典转模型,并且赋值给retweeted_status属性
            retweeted_status = HMStatus(dict: dict)
            
            // 一定要记得return
            return
        }
        
        super.setValue(value, forKey: key)
    }
    
    /// setValue(value, forKey: key) 字典中的key在模型中找不到对应的属性
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    /// 对象的打印, 递归是自己调用自己
    override var description: String {
        get {
            let keys = ["created_at", "id", "text", "source", "pic_urls", "user", "retweeted_status"]
            // 通过key在模型中招属性的值,找到属性的值,将key和值,拼接到字典里面
            return "\n \t微博模型: \(self.dictionaryWithValuesForKeys(keys).description)"
        }
    }
}
